package com.ia.aistream.manager.framework.redis;


import org.springframework.data.redis.core.ZSetOperations;

import java.util.Set;

/**
 * @author chenjunsheng
 */
public interface RedisZsetManager {

    /**
     * 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
     *
     * @param key
     * @param score
     * @param member
     */
    void zadd(String key, double score, Object member);

    /**
     * 返回有序集 key 中，成员 member 的 score 值。
     *
     * @param key
     * @param member
     * @return
     */
    Double zscore(String key, Object member);

    /**
     * 为有序集 key 的成员 member 的 score 值加上增量 increment 。
     *
     * @param key
     * @param increment
     * @param member
     * @return member 成员的新 score 值，以字符串形式表示。
     */
    Double zincrby(String key, double increment, Object member);

    /**
     * 返回有序集 key 的基数。
     *
     * @param key
     * @return 当 key 存在且是有序集类型时，返回有序集的基数。 当 key 不存在时，返回 0 。
     */
    long zcard(String key);

    /**
     * 返回有序集 key 中，指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序。具有相同 score 值的成员按字典序(lexicographical order )来排列。
     *
     * @param key
     * @param start
     * @param stop
     * @param <T>
     * @return 指定区间内，带有 score 值(可选)的有序集成员的列表。
     */
    <T> Set<T> zrange(String key, int start, int stop);

    /**
     * 返回有序集 key 中，指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序。具有相同 score 值的成员按字典序(lexicographical order )来排列。
     *
     * @param <T>
     * @param key
     * @param start
     * @param stop
     * @param withscores
     * @return 指定区间内，带有 score 值(可选)的有序集成员的列表。
     */
    <T> Set<ZSetOperations.TypedTuple<T>> zrange(String key, int start, int stop, boolean withscores);

    /**
     * 返回有序集 key 中，所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
     *
     * @param key
     * @param min
     * @param max
     * @param <T>
     * @return
     */
    <T> Set<T> zrangebyscore(String key, double min, double max);

    /**
     * 返回有序集 key 中，所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
     *
     * @param key
     * @param min
     * @param max
     * @param <T>
     * @return
     */
    <T> Set<T> zrangebyscore(String key, double min, double max, int offset, int count);

    /**
     * 返回有序集 key 中，所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
     *
     * @param key
     * @param min
     * @param max
     * @param withscores
     * @param <T>
     * @return
     */
    <T> Set<ZSetOperations.TypedTuple<T>> zrangebyscore(String key, double min, double max, boolean withscores, int offset, int count);

    /**
     * 返回有序集 key 中，指定区间内的成员。
     * <p>
     * 其中成员的位置按 score 值递减(从大到小)来排列。 具有相同 score 值的成员按字典序的逆序
     *
     * @param <T>
     * @param key
     * @param start
     * @param stop
     * @return 返回有序集 key 中，指定区间内的成员。
     */
    <T> Set<T> zrevrange(String key, int start, int stop);

    /**
     * 移除有序集 key 中的一个或多个成员，不存在的成员将被忽略。
     *
     * @param key
     * @param member
     */
    void zrem(String key, Object member);
}
